package com.CRApp.controller;

import com.CRApp.pojo.Cart;
import com.CRApp.pojo.CartItemDTO;
import com.CRApp.pojo.Result;
import com.CRApp.service.CartService;
import com.CRApp.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @ClassName: CartController
 * @Author : GXXbrandy
 * Description : 购物车控制器，提供购物车相关操作的API
 */
@RestController
@RequestMapping("/cart")
@Validated
public class CartController {
    
    @Autowired
    private CartService cartService;
    
    /**
     * 添加商品到购物车
     * 如果购物车中已存在相同商品，则增加数量
     */
    @PostMapping("/add")
    public Result<?> addToCart(@RequestBody Map<String, Object> params) {
        // 从ThreadLocal中获取当前登录用户ID
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Integer userId = (Integer) userInfo.get("id");
        
        if (userId == null) {
            return Result.error("添加失败：用户未登录");
        }
        
        // 获取参数
        Integer productId = (Integer) params.get("productId");
        Integer quantity = (Integer) params.get("quantity");
        
        if (productId == null || quantity == null) {
            return Result.error("添加失败：商品ID和数量不能为空");
        }
        
        // 创建购物车对象
        Cart cart = new Cart();
        cart.setUserId(userId);
        cart.setProductId(productId);
        cart.setQuantity(quantity);
        
        boolean success = cartService.addToCart(cart);
        return success ? Result.success() : Result.error("添加失败");
    }
    
    /**
     * 获取当前用户的购物车列表（带商品详情）
     * 查询当前登录用户的所有购物车项，并包含商品详情
     */
    @GetMapping("/list")
    public Result<List<CartItemDTO>> getUserCart() {
        // 从ThreadLocal中获取当前登录用户ID
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Integer userId = (Integer) userInfo.get("id");
        
        if (userId == null) {
            return Result.error("查询失败：用户未登录");
        }
        
        List<CartItemDTO> cartItems = cartService.getUserCartWithProductDetails(userId);
        return Result.success(cartItems);
    }
    
    /**
     * 更新购物车商品数量
     * 修改指定购物车项的商品数量
     */
    @PostMapping("/update")
    public Result<?> updateQuantity(@RequestBody Map<String, Object> params) {
        // 从ThreadLocal中获取当前登录用户ID
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Integer userId = (Integer) userInfo.get("id");
        
        if (userId == null) {
            return Result.error("更新失败：用户未登录");
        }
        
        // 获取参数
        Integer cartId = (Integer) params.get("cartId");
        Integer quantity = (Integer) params.get("quantity");
        
        if (cartId == null || quantity == null) {
            return Result.error("更新失败：购物车项ID和数量不能为空");
        }
        
        if (quantity <= 0) {
            return Result.error("更新失败：商品数量必须大于0");
        }
        
        boolean success = cartService.updateQuantity(cartId, quantity);
        return success ? Result.success() : Result.error("更新失败");
    }
    
    /**
     * 删除购物车中的特定商品
     * 根据商品ID删除当前用户购物车中的商品
     */
    @DeleteMapping("/delete/{productId}")
    public Result<?> deleteFromCart(@PathVariable Integer productId) {
        // 从ThreadLocal中获取当前登录用户ID
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Integer userId = (Integer) userInfo.get("id");
        
        if (userId == null) {
            return Result.error("删除失败：用户未登录");
        }
        
        if (productId == null) {
            return Result.error("删除失败：商品ID不能为空");
        }
        
        boolean success = cartService.deleteCartProduct(userId, productId);
        return success ? Result.success() : Result.error("删除失败");
    }
    
    /**
     * 清空购物车中的所有商品
     * 删除当前登录用户的所有购物车项，但保留购物车
     */
    @DeleteMapping("/clear")
    public Result<?> clearUserCart() {
        // 从ThreadLocal中获取当前登录用户ID
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Integer userId = (Integer) userInfo.get("id");
        
        if (userId == null) {
            return Result.error("清空失败：用户未登录");
        }
        
        boolean success = cartService.clearUserCart(userId);
        return success ? Result.success() : Result.error("清空购物车失败");
    }
    
    /**
     * 获取购物车项详情（带商品详情）
     * 查询指定购物车项ID的详细信息，并包含商品详情
     */
    @GetMapping("/detail/{cartId}")
    public Result<CartItemDTO> getCartItem(@PathVariable Integer cartId) {
        // 从ThreadLocal中获取当前登录用户ID
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Integer userId = (Integer) userInfo.get("id");
        
        if (userId == null) {
            return Result.error("查询失败：用户未登录");
        }
        
        if (cartId == null) {
            return Result.error("查询失败：购物车项ID不能为空");
        }
        
        CartItemDTO cartItem = cartService.getCartItemWithProductDetails(cartId);
        
        // 验证购物车项是否属于当前用户（安全检查）
        if (cartItem != null && !cartItem.getUserId().equals(userId)) {
            return Result.error("查询失败：无权访问该购物车项");
        }
        
        return cartItem != null ? Result.success(cartItem) : Result.error("未找到该购物车项");
    }
}